{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import random\n",
    "from tqdm import tqdm\n",
    "import time\n",
    "sns.set()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_vocab(file, lower = False):\n",
    "    with open(file, 'r') as fopen:\n",
    "        data = fopen.read()\n",
    "    if lower:\n",
    "        data = data.lower()\n",
    "    data = data.split()\n",
    "    vocab = list(set(data))\n",
    "    return data, vocab\n",
    "\n",
    "def embed_to_onehot(data, vocab):\n",
    "    onehot = np.zeros((len(data), len(vocab)), dtype = np.float32)\n",
    "    for i in range(len(data)):\n",
    "        onehot[i, vocab.index(data[i])] = 1.0\n",
    "    return onehot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "text, text_vocab = get_vocab('shakespeare.txt', lower = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_rate = 0.01\n",
    "batch_size = 16\n",
    "sequence_length = 32\n",
    "epoch = 3000\n",
    "num_layers = 2\n",
    "size_layer = 256\n",
    "possible_batch_id = range(len(text) - sequence_length - 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model:\n",
    "    def __init__(self, num_layers, size_layer, dimension, sequence_length, learning_rate):\n",
    "        def lstm_cell():\n",
    "            return tf.nn.rnn_cell.LSTMCell(size_layer, sequence_length, state_is_tuple = False)\n",
    "        self.rnn_cells = tf.nn.rnn_cell.MultiRNNCell([lstm_cell() for _ in range(num_layers)], \n",
    "                                                     state_is_tuple = False)\n",
    "        self.X = tf.placeholder(tf.float32, (None, None, dimension))\n",
    "        self.Y = tf.placeholder(tf.float32, (None, None, dimension))\n",
    "        self.hidden_layer = tf.placeholder(tf.float32, (None, num_layers * 2 * size_layer))\n",
    "        self.outputs, self.last_state = tf.nn.dynamic_rnn(self.rnn_cells, self.X, \n",
    "                                                          initial_state = self.hidden_layer, \n",
    "                                                          dtype = tf.float32)\n",
    "        rnn_W = tf.Variable(tf.random_normal((size_layer, dimension)))\n",
    "        rnn_B = tf.Variable(tf.random_normal([dimension]))\n",
    "        self.logits = tf.matmul(tf.reshape(self.outputs, [-1, size_layer]), rnn_W) + rnn_B\n",
    "        y_batch_long = tf.reshape(self.Y, [-1, dimension])\n",
    "        self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = self.logits, \n",
    "                                                                           labels = y_batch_long))\n",
    "        self.optimizer = tf.train.RMSPropOptimizer(learning_rate, 0.9).minimize(self.cost)\n",
    "        self.correct_pred = tf.equal(tf.argmax(self.logits, 1), tf.argmax(y_batch_long, 1))\n",
    "        self.accuracy = tf.reduce_mean(tf.cast(self.correct_pred, tf.float32))\n",
    "        seq_shape = tf.shape(self.outputs)\n",
    "        self.final_outputs = tf.reshape(tf.nn.softmax(self.logits), \n",
    "                                        (seq_shape[0], seq_shape[1], \n",
    "                                         dimension))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f0358f719b0>: Using a concatenated state is slower and will soon be deprecated.  Use state_is_tuple=True.\n",
      "WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f02c0669048>: Using a concatenated state is slower and will soon be deprecated.  Use state_is_tuple=True.\n",
      "WARNING:tensorflow:From <ipython-input-5-f93e36d4bd1f>:18: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "sess = tf.InteractiveSession()\n",
    "model = Model(num_layers, size_layer, len(text_vocab), sequence_length, learning_rate)\n",
    "sess.run(tf.global_variables_initializer())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_random_sequence():\n",
    "    LOST, ACCURACY = [], []\n",
    "    pbar = tqdm(range(epoch), desc = 'epoch')\n",
    "    for i in pbar:\n",
    "        last_time = time.time()\n",
    "        init_value = np.zeros((batch_size, num_layers * 2 * size_layer))\n",
    "        batch_x = np.zeros((batch_size, sequence_length, len(text_vocab)))\n",
    "        batch_y = np.zeros((batch_size, sequence_length, len(text_vocab)))\n",
    "        batch_id = random.sample(possible_batch_id, batch_size)\n",
    "        for n in range(sequence_length):\n",
    "            id1 = embed_to_onehot([text[k + n] for k in batch_id], text_vocab)\n",
    "            id2 = embed_to_onehot([text[k + n + 1] for k in batch_id], text_vocab)\n",
    "            batch_x[:,n,:] = id1\n",
    "            batch_y[:,n,:] = id2\n",
    "        last_state, _, loss = sess.run([model.last_state, model.optimizer, model.cost], \n",
    "                                       feed_dict = {model.X: batch_x, \n",
    "                                                    model.Y: batch_y,\n",
    "                                                    model.hidden_layer: init_value})\n",
    "        accuracy = sess.run(model.accuracy, feed_dict = {model.X: batch_x, \n",
    "                                                         model.Y: batch_y, \n",
    "                                                         model.hidden_layer: init_value})\n",
    "        ACCURACY.append(accuracy); LOST.append(loss)\n",
    "        init_value = last_state\n",
    "        pbar.set_postfix(cost = loss, accuracy = accuracy)\n",
    "    return LOST, ACCURACY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch: 100%|██████████| 3000/3000 [33:51<00:00,  1.50it/s, accuracy=0.881, cost=2.97] \n"
     ]
    }
   ],
   "source": [
    "LOST, ACCURACY = train_random_sequence()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4EAAAFICAYAAADu0vuZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd4W9X5B/CvJO8ZxyPL2YlPFiGDLJKQwWxLCy3QFiiUXygto6RQCqRlFEqhAcomzJICAcIOEHYzIItsZyfHGR6J48R7b0m/PzSsaUnWla7G9/M8PJGOjq7emxhLr86576sxGo0gIiIiIiKi6KBVOwAiIiIiIiIKHiaBREREREREUYRJIBERERERURRhEkhERERERBRFmAQSERERERFFESaBREREREREUYRJIBERERERURRhEkhERERERBRFmAQSERERERFFESaBREREREREUYRJIBERERERURSJUTsAP8UDmAKgDIBe5ViIiChwdAD6AdgGoE3lWMIB3x+JiKKHz++R4Z4ETgGwXu0giIgoaGYD2KB2EGGA749ERNHH6/fIcE8CywCgpqYJBoOxxwfJzExBVVWjYkGFqmg4z2g4R4DnGUmi4RwB/89Tq9UgIyMZMP/eJ48UeX8EouNnNBrOEeB5RpJoOEeA5+mtnrxHhnsSqAcAg8Ho95ucv88PF9FwntFwjgDPM5JEwzkCip0ntzZ6R7H3R8txIl00nCPA84wk0XCOAM/TR16/R7IwDBERERERURRhEkhERERERBRFmAQSERERERFFESaBREREREREUYRJIBERERERURRhEkhERERERBRFmAQSERERERFFESaBREREREREUSTqk8CVm4rwweoCtcMgIiIiIiIFnShvRGNLh1/HOFnZhNueXY/axjaFogoNUZ8E7jhUjje/PIhOvUHtUIiIiIiISCH3L92Kf7y+za9jrNpxAvXNHcgvqFAoqtAQ9UlgSXkjAGCHjKx/WCIiIiKiaFdZ1+rfAYxGReIwGIx44ZN9OHay3jrW2NKBOpVWGKM+CbTQaTVqh0BERERERCHEmgJq/MsVahvbsP1QOZ7/eI91bOEz63H78xv9Om5PRX0SeNOl4wAADX7uFyYiIiIioshkmwKWVjbhg7VHYDSvEra2d6KtXW993Gg0or6p3e75MTGmtKu5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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (15, 5))\n",
    "plt.subplot(1, 2, 1)\n",
    "EPOCH = np.arange(len(LOST))\n",
    "plt.plot(EPOCH, LOST)\n",
    "plt.xlabel('epoch'); plt.ylabel('loss')\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(EPOCH, ACCURACY)\n",
    "plt.xlabel('epoch'); plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['should', 'begin', 'and', 'end,', 'but']\n"
     ]
    }
   ],
   "source": [
    "split_text = text\n",
    "selected_index = np.random.randint(0, len(split_text) - 5)\n",
    "tag = split_text[selected_index:selected_index + 5]\n",
    "print(tag)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_based_sequence(length_sentence, argmax = False):\n",
    "    sentence_generated = tag[:]\n",
    "    onehot = embed_to_onehot(tag, text_vocab)\n",
    "    init_value = np.zeros((1, num_layers * 2 * size_layer))\n",
    "    for i in range(len(tag)):\n",
    "        batch_x = np.zeros((1, 1, len(text_vocab)))\n",
    "        batch_x[:, 0, :] = onehot[i, :]\n",
    "        last_state, prob = sess.run(\n",
    "            [model.last_state, model.final_outputs],\n",
    "            feed_dict = {model.X: batch_x, model.hidden_layer: init_value},\n",
    "        )\n",
    "        init_value = last_state\n",
    "\n",
    "    for i in range(length_sentence):\n",
    "        if argmax:\n",
    "            index = np.argmax(prob[0][0])\n",
    "        else:\n",
    "            index = np.random.choice(range(len(text_vocab)), p = prob[0][0])\n",
    "        element = [text_vocab[index]]\n",
    "        sentence_generated += element\n",
    "        onehot = embed_to_onehot(element, text_vocab)\n",
    "        batch_x = np.zeros((1, 1, len(text_vocab)))\n",
    "        batch_x[:, 0, :] = onehot[0, :]\n",
    "        last_state, prob = sess.run(\n",
    "            [model.last_state, model.final_outputs],\n",
    "            feed_dict = {model.X: batch_x, model.hidden_layer: init_value},\n",
    "        )\n",
    "        init_value = last_state\n",
    "\n",
    "    return ' '.join(sentence_generated)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "should begin and end, but will lose those he hath won. brutus: in that there's comfort. sicinius: doubt not the commoners, for whom we say we will be witnesses. petruchio: father, and wife, and gentlemen, adieu; i will to venice; sunday comes apace: we will have rings and things and them, we will be witnesses. petruchio: father, and thou taught me love, or thy brother a lord it is the duke of the field by tewksbury when oxford had me no more than your poor marcius: cominius: they are all to be you in a fair canon, must i be command?' let me be a\n"
     ]
    }
   ],
   "source": [
    "print(generate_based_sequence(100,True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "should begin and end, but will lose those he evil. the aching doth renown'd for sweet gifts; in honourable royal. we'll home! remain. pause, and most distemper'd kingdom fool to call upon a son thus rued a head which that art sin to sounds: thoughts, which is hastings: do more ones; but when you would were anger'd, and he, their all biondello? come, i menenius: a fellow strumpet-- brutus: not devise one say you can picked then heinous can you slaughter-man all aged man pardon,-- the kiss. learn'd, be not the friends. gloucester: send me prince's some robs some goodly aves the slaves! sort not\n"
     ]
    }
   ],
   "source": [
    "print(generate_based_sequence(100,False))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
